home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 60265 / 60265.xpi / chrome / content / pwdedit.js < prev    next >
Text File  |  2010-02-09  |  7KB  |  198 lines

  1. /*
  2.     Saved Password Editor, extension for Firefox 3.0+
  3.     Copyright (C) 2010  Daniel Dawson <ddawson@icehouse.net>
  4.  
  5.     This program is free software: you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation, either version 3 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17. */
  18.  
  19. function el (name) {
  20.   return document.getElementById(name);
  21. }
  22.  
  23. const Cc = Components.classes, Ci = Components.interfaces;
  24.  
  25. var strBundle;
  26. var oldSignon;
  27.  
  28. window.addEventListener(
  29.   "DOMContentLoaded",
  30.   function loadHandler (ev) {
  31.     strBundle = el("string-bundle");
  32.     oldSignon = window.arguments[0];
  33.     var haveOldSignon = false;
  34.     if (!oldSignon) {
  35.       oldSignon = Cc["@mozilla.org/login-manager/loginInfo;1"].
  36.                     createInstance(Ci.nsILoginInfo);
  37.       oldSignon.init("", "", "", "", "", "", "");
  38.       el("header").setAttribute("title", strBundle.getString("newlogin"));
  39.     } else {
  40.       el("header").setAttribute("title", strBundle.getString("editlogin"));
  41.       haveOldSignon = true;
  42.     }
  43.  
  44.     el("hostname_text").value = oldSignon.hostname;
  45.     el("formSubmitURL_text").value = oldSignon.formSubmitURL;
  46.     el("httpRealm_text").value = oldSignon.httpRealm;
  47.     el("username_text").value = oldSignon.username;
  48.     el("password_text").value = oldSignon.password;
  49.     el("usernameField_text").value = oldSignon.usernameField;
  50.     el("passwordField_text").value = oldSignon.passwordField;
  51.  
  52.     if (!oldSignon.httpRealm)
  53.       el("type_group").selectedIndex = 0;
  54.     else if (oldSignon.hostname.match(/^http/))
  55.       el("type_group").selectedIndex = 1;
  56.     else
  57.       el("type_group").selectedIndex = 2;
  58.  
  59.     var xai = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);
  60.     switch (xai.ID) {
  61.     case "{3550f703-e582-4d05-9a08-453d09bdfdc6}":  // Thunderbird
  62.       el("type_form").hidden = true;
  63.       if (!haveOldSignon)
  64.         el("type_group").selectedIndex = 1;
  65.       break;
  66.  
  67.     case "{718e30fb-e89b-41dd-9da7-e25a45638b28}":  // Sunbird
  68.       el("type_groupbox").hidden = true;
  69.       el("type_group").selectedIndex = 2;
  70.       break;
  71.  
  72.     // Nothing to do for Firefox and SeaMonkey
  73.     }
  74.  
  75.     handle_typeSelect();
  76.  
  77.     if (haveOldSignon)
  78.       el("type_group").disabled = true;
  79.  
  80.     window.removeEventListener("DOMContentLoaded", loadHandler, false);
  81.   },
  82.   false);
  83.  
  84. function handle_typeSelect () {
  85.   var idx = el("type_group").selectedIndex;
  86.   if (idx == 0) {
  87.     el("formSubmitURL_row").collapsed = false;
  88.     el("httpRealm_row").collapsed = true;
  89.     el("usernameField_row").collapsed = false;
  90.     el("passwordField_row").collapsed = false;
  91.     el("guessFromPage_btn").collapsed = false;
  92.   } else {
  93.     el("formSubmitURL_row").collapsed = true;
  94.     el("httpRealm_row").collapsed = idx == 2;
  95.     el("usernameField_row").collapsed = true;
  96.     el("passwordField_row").collapsed = true;
  97.     el("guessFromPage_btn").collapsed = true;
  98.   }
  99. }
  100.  
  101. function togglePasswordView () {
  102.   var pwdField = el("password_text");
  103.   var pwdViewButton = el("passwordView_btn");
  104.   if (pwdField.type == "password") {
  105.     pwdField.removeAttribute("type");
  106.     pwdViewButton.label = strBundle.getString("hide");
  107.     pwdViewButton.accessKey = strBundle.getString("hideaccesskey");
  108.   } else {
  109.     pwdField.setAttribute("type", "password");
  110.     pwdViewButton.label = strBundle.getString("show");
  111.     pwdViewButton.accessKey = strBundle.getString("showaccesskey");
  112.   }
  113. }
  114.  
  115. function guessParameters () {
  116.   // Locate the browser object for the last seen tab
  117.   var curBrowser =
  118.     Cc["@mozilla.org/appshell/window-mediator;1"].
  119.     getService(Ci.nsIWindowMediator).getMostRecentWindow("navigator:browser").
  120.     document.getElementById("content").selectedBrowser;
  121.  
  122.   // Get the host prefix
  123.   var curLocation = curBrowser.contentWindow.location;
  124.   var hostname = curLocation.protocol + "//" + curLocation.host;
  125.  
  126.   // Locate a likely login form and its fields
  127.   var curDoc = curBrowser.contentDocument;
  128.   var pwdFields = curDoc.evaluate(
  129.     '//form//input[@type="password"]', curDoc, null,
  130.     XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  131.   if (pwdFields.snapshotLength == 0) {
  132.     Cc["@mozilla.org/embedcomp/prompt-service;1"].
  133.       getService(Ci.nsIPromptService).
  134.       alert(window, strBundle.getString("error"),
  135.             strBundle.getString("nologinform"));
  136.     return;
  137.   }
  138.   for (var i = 0; i < pwdFields.snapshotLength; i++) {
  139.     var pwdField = pwdFields.snapshotItem(i), form = pwdField.form;
  140.     var unameField = curDoc.evaluate(
  141.       './/input[@type="text" and not(preceding::input[@type="password"])]' +
  142.         '[last()]',
  143.       form, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  144.     if (unameField) break;
  145.   }
  146.  
  147.   if (!unameField) {
  148.     Cc["@mozilla.org/embedcomp/prompt-service;1"].
  149.       getService(Ci.nsIPromptService).
  150.       alert(window, strBundle.getString("error"),
  151.             strBundle.getString("nologinform"));
  152.     return;
  153.   }
  154.  
  155.   // Construct the submit prefix
  156.   var formAction = form.getAttribute("action");
  157.   var res = /^([0-9-_A-Za-z]+:\/\/[^/]+)\//.exec(formAction);
  158.   var formSubmitURL;
  159.   if (res)
  160.     formSubmitURL = res[1];
  161.   else
  162.     formSubmitURL = hostname;
  163.  
  164.   // Populate the editor form
  165.   el("hostname_text").value = hostname;
  166.   el("formSubmitURL_text").value = formSubmitURL;
  167.   el("username_text").value = unameField.value;
  168.   el("password_text").value = pwdField.value;
  169.   el("usernameField_text").value = unameField.getAttribute("name");
  170.   el("passwordField_text").value = pwdField.getAttribute("name");
  171. }
  172.  
  173. function setNewSignon () {
  174.   var hostname = el("hostname_text").value,
  175.     formSubmitURL, httpRealm,
  176.     username = el("username_text").value,
  177.     password = el("password_text").value,
  178.     usernameField, passwordField;
  179.   var idx = el("type_group").selectedIndex;
  180.  
  181.   if (idx == 0) {
  182.     formSubmitURL = el("formSubmitURL_text").value;
  183.     httpRealm = null;
  184.     usernameField = el("usernameField_text").value;
  185.     passwordField = el("passwordField_text").value;
  186.   } else {
  187.     formSubmitURL = null;
  188.     httpRealm = idx == 1 ? el("httpRealm_text").value : hostname;
  189.     usernameField = passwordField = "";
  190.   }
  191.  
  192.   var newSignon = Cc["@mozilla.org/login-manager/loginInfo;1"].
  193.                     createInstance(Ci.nsILoginInfo);
  194.   newSignon.init(hostname, formSubmitURL, httpRealm, username, password,
  195.                  usernameField, passwordField);
  196.   window.arguments[1].newSignon = newSignon;
  197. }
  198.